Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / eect / packs / test_auth_surface_pack.py

Displaying Raw • Download


tests/backend/eect/packs/test_auth_surface_pack.py e5756d7ab065475a18acdcafc008a767fcff87e0 (e5756d7a) Text, 5.44 KB

T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""AuthSurfacePack: mutating HTTP without CSRF must die; with CSRF must pass."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787secrets

Tff7b72import T7ee787pytest
Tff7b72from T7ee787aiohttp Tff7b72import Te6edf3web
Tff7b72from T7ee787aiohttpT7ee787.T7ee787test_utils Tff7b72import Te6edf3TestClientTb4b4b4, Te6edf3TestServer
Tff7b72from T7ee787aiohttp_session Tff7b72import Te6edf3setup Tff7b72as Te6edf3setup_session

Tff7b72from T7ee787testsT7ee787.T7ee787backendT7ee787.T7ee787conftest Tff7b72import Te6edf3extend_meshchat_middlewaresTb4b4b4, Te6edf3fetch_api_csrf_headers
Tff7b72from T7ee787testsT7ee787.T7ee787backendT7ee787.T7ee787eectT7ee787.T7ee787asserts Tff7b72import Te6edf3assert_no_unexpected_http_500
Tff7b72from T7ee787testsT7ee787.T7ee787backendT7ee787.T7ee787eectT7ee787.T7ee787harness Tff7b72import Te6edf3eect_scenario

Te6edf3pytestmark Tff7b72= Tb4b4b4[
Te6edf3pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffeectTb4b4b4,
Te6edf3pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffusefixturesTb4b4b4(Ta5d6ff"Ta5d6ffrequire_loopback_tcpTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4]

T8b949e# Curated mutating surfaces that accept empty/minimal bodies without deep state.
Te6edf3_MUTATING_SAMPLES Tff7b72= Tb4b4b4(
Tb4b4b4(Ta5d6ff"Ta5d6ffPATCHTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/server/securityTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffweb_ui_ip_allowlistTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff"Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/app/tutorial/seenTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/app/changelog/seenTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff999.999.999Ta5d6ff"Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/filesync/startTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/filesync/stopTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/filesync/announceTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/filesync/connectTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffidentity_hashTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/filesync/disconnectTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffpeer_idTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/filesync/browseTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffpeer_idTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/filesync/downloadTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffpeer_idTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffa.txtTa5d6ff"Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/filesync/aclTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffenforceTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPATCHTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/filesync/settingsTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/filesync/mkdirTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffolderTa5d6ff"Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffDELETETa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/filesync/entryTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffa.txtTa5d6ff"Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/api/v1/lxmf/propagation-node/cancel-inboundTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8ff_make_aio_appTb4b4b4(Te6edf3mock_appTb4b4b4, Te6edf3use_httpsTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Te6edf3mock_appTff7b72.Td2a8ffsession_secret_key Tff7b72= Te6edf3secretsTff7b72.Td2a8fftoken_urlsafeTb4b4b4(T79c0ff32Tb4b4b4)
Te6edf3mock_appTff7b72.Td2a8fflisten_host Tff7b72= Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"
Te6edf3mock_appTff7b72.Td2a8fflisten_port Tff7b72= T79c0ff8000
Te6edf3mock_appTff7b72.Td2a8ffuse_https Tff7b72= Te6edf3use_https
Te6edf3mock_appTff7b72.Td2a8fflandlock_active Tff7b72= Tff7b72False
Te6edf3routes Tff7b72= Te6edf3webTff7b72.Td2a8ffRouteTableDefTb4b4b4(Tb4b4b4)
Te6edf3middlewares Tff7b72= Te6edf3mock_appTff7b72.Td2a8ff_define_routesTb4b4b4(Te6edf3routesTb4b4b4)
Te6edf3aio_app Tff7b72= Te6edf3webTff7b72.Td2a8ffApplicationTb4b4b4(Tb4b4b4)
Te6edf3setup_sessionTb4b4b4(Te6edf3aio_appTb4b4b4, Te6edf3mock_appTff7b72.Td2a8ff_encrypted_cookie_storageTb4b4b4(Te6edf3use_httpsTb4b4b4)Tb4b4b4)
Te6edf3extend_meshchat_middlewaresTb4b4b4(Te6edf3aio_appTb4b4b4, Te6edf3middlewaresTb4b4b4)
Te6edf3aio_appTff7b72.Td2a8ffadd_routesTb4b4b4(Te6edf3routesTb4b4b4)
Tff7b72return Te6edf3aio_app


Tff7b72def Td2a8ff_stub_filesync_handlerTb4b4b4(Te6edf3mock_appTb4b4b4)Tb4b4b4:
Te6edf3handler Tff7b72= Te6edf3mock_appTff7b72.Td2a8ffrns_filesync_handler
Tff7b72if Te6edf3handler Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Te6edf3handlerTff7b72.Td2a8ffreticulum Tff7b72= Tffa657objectTb4b4b4(Tb4b4b4)
Te6edf3handlerTff7b72.Td2a8ffstartTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffstopTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffannounce_nowTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffconnect_peerTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpeer_idTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffaaTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffdisconnect_peerTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpeer_idTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbbTa5d6ff" Tff7b72* T79c0ff16Tb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffbrowse_peerTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffdownload_fileTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffa.txtTa5d6ff"Tb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffupdate_aclTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffenforceTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4, Ta5d6ff"Ta5d6ffrulesTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffupdate_settingsTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffsync_directoryTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/tmpTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4: T79c0ff300Tb4b4b4,
Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Tb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffmanager_mkdirTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffolderTa5d6ff"Tb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffmanager_deleteTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffa.txtTa5d6ff"Tb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffmanager_uploadTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4, Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffa.txtTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4}
Te6edf3handlerTff7b72.Td2a8fflist_treeTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffcurrentTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffparentTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Tb4b4b4}
Te6edf3handlerTff7b72.Td2a8ffmanager_contentTff7b72.Td2a8ffreturn_value Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fferrorTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpath not allowedTa5d6ff"Tb4b4b4,
Tb4b4b4}


Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_eect_mutating_without_csrf_rejectedTb4b4b4(Te6edf3mock_appTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3eect_scenarioTb4b4b4(Ta5d6ff"Ta5d6ffauth.csrf.mutating_without_tokenTa5d6ff"Tb4b4b4) Tff7b72as Tb4b4b4(Te6edf3_sTb4b4b4, Te6edf3_seedTb4b4b4, Te6edf3rngTb4b4b4)Tb4b4b4:
Te6edf3monkeypatchTff7b72.Td2a8ffdelenvTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_DISABLE_CSRFTa5d6ff"Tb4b4b4, Te6edf3raisingTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3aio_app Tff7b72= Te6edf3_make_aio_appTb4b4b4(Te6edf3mock_appTb4b4b4)
Te6edf3samples Tff7b72= Tffa657listTb4b4b4(Te6edf3_MUTATING_SAMPLESTb4b4b4)
Te6edf3rngTff7b72.Td2a8ffshuffleTb4b4b4(Te6edf3samplesTb4b4b4)
Tff7b72async Tff7b72with Te6edf3TestClientTb4b4b4(Te6edf3TestServerTb4b4b4(Te6edf3aio_appTb4b4b4)Tb4b4b4) Tff7b72as Te6edf3clientTb4b4b4:
Tff7b72for Te6edf3methodTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3body Tff7b72in Te6edf3samplesTb4b4b4:
Tff7b72if Te6edf3method Tff7b72== Ta5d6ff"Ta5d6ffPATCHTa5d6ff"Tb4b4b4:
Te6edf3resp Tff7b72= Tff7b72await Te6edf3clientTff7b72.Td2a8ffpatchTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3jsonTff7b72=Te6edf3bodyTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3resp Tff7b72= Tff7b72await Te6edf3clientTff7b72.Td2a8ffpostTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3jsonTff7b72=Te6edf3bodyTb4b4b4)
Te6edf3assert_no_unexpected_http_500Tb4b4b4(Te6edf3respTff7b72.Td2a8ffstatusTb4b4b4, Tff7b72await Te6edf3respTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3respTff7b72.Td2a8ffstatus Tff7b72== T79c0ff403Tb4b4b4, Tb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Te6edf3methodTffd700}Ta5d6ff Tffd700{Te6edf3pathTffd700}Ta5d6ff expected 403 got Tffd700{Te6edf3respTff7b72.Td2a8ffstatusTffd700}Ta5d6ff"
Tb4b4b4)


Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_eect_mutating_with_csrf_acceptedTb4b4b4(Te6edf3mock_appTb4b4b4, Te6edf3monkeypatchTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3eect_scenarioTb4b4b4(Ta5d6ff"Ta5d6ffauth.csrf.mutating_with_tokenTa5d6ff"Tb4b4b4) Tff7b72as Tb4b4b4(Te6edf3_sTb4b4b4, Te6edf3_seedTb4b4b4, Te6edf3rngTb4b4b4)Tb4b4b4:
Te6edf3monkeypatchTff7b72.Td2a8ffdelenvTb4b4b4(Ta5d6ff"Ta5d6ffMESHCHAT_DISABLE_CSRFTa5d6ff"Tb4b4b4, Te6edf3raisingTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3_stub_filesync_handlerTb4b4b4(Te6edf3mock_appTb4b4b4)
Te6edf3aio_app Tff7b72= Te6edf3_make_aio_appTb4b4b4(Te6edf3mock_appTb4b4b4)
Te6edf3samples Tff7b72= Tffa657listTb4b4b4(Te6edf3_MUTATING_SAMPLESTb4b4b4)
Te6edf3rngTff7b72.Td2a8ffshuffleTb4b4b4(Te6edf3samplesTb4b4b4)
Tff7b72async Tff7b72with Te6edf3TestClientTb4b4b4(Te6edf3TestServerTb4b4b4(Te6edf3aio_appTb4b4b4)Tb4b4b4) Tff7b72as Te6edf3clientTb4b4b4:
Te6edf3headers Tff7b72= Tff7b72await Te6edf3fetch_api_csrf_headersTb4b4b4(Te6edf3clientTb4b4b4)
Tff7b72for Te6edf3methodTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3body Tff7b72in Te6edf3samplesTb4b4b4:
Tff7b72if Te6edf3method Tff7b72== Ta5d6ff"Ta5d6ffPATCHTa5d6ff"Tb4b4b4:
Te6edf3resp Tff7b72= Tff7b72await Te6edf3clientTff7b72.Td2a8ffpatchTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3jsonTff7b72=Te6edf3bodyTb4b4b4, Te6edf3headersTff7b72=Te6edf3headersTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3resp Tff7b72= Tff7b72await Te6edf3clientTff7b72.Td2a8ffpostTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3jsonTff7b72=Te6edf3bodyTb4b4b4, Te6edf3headersTff7b72=Te6edf3headersTb4b4b4)
Te6edf3body_text Tff7b72= Tff7b72await Te6edf3respTff7b72.Td2a8fftextTb4b4b4(Tb4b4b4)
Te6edf3assert_no_unexpected_http_500Tb4b4b4(Te6edf3respTff7b72.Td2a8ffstatusTb4b4b4, Te6edf3body_textTb4b4b4)
Tff7b72assert Te6edf3respTff7b72.Td2a8ffstatus Tff7b72!= T79c0ff403Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3methodTffd700}Ta5d6ff Tffd700{Te6edf3pathTffd700}Ta5d6ff still CSRF-blockedTa5d6ff"
Tff7b72assert Te6edf3respTff7b72.Td2a8ffstatus Tff7b72< T79c0ff500


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────